
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 文件名：config_file_handler.py
# 描述：配置文件处理器，用于更新各种配置文件中的数据库密码
# 作者：Craft
# 日期：2024-01-20

import re
import os
import json
from PyQt5.QtCore import pyqtSignal, QObject

class ConfigFileHandler(QObject):
    """
    配置文件处理类，用于管理和更新多个配置文件中的数据库密码
    继承自QObject以支持信号机制
    """
    
    # 定义信号用于通知配置更新状态
    config_updated_signal = pyqtSignal(bool, str)
    
    def __init__(self, file_paths):
        """
        初始化配置文件处理器
        :param file_paths: 需要更新的配置文件路径列表
        """
        super().__init__()
        self.file_paths = file_paths
    
    def update_password(self, new_password):
        """
        更新所有配置文件中的数据库密码
        :param new_password: 新的数据库密码
        
        处理流程：
        1. 首先更新主配置文件(config.json)
        2. 然后更新其他配置文件中的密码
        """
        # 更新主配置文件(config.json)中的数据库密码
        try:
            with open("config/config.json", "r+") as f:
                # 读取现有配置
                config = json.load(f)
                
                # 确保存在数据库配置节点
                if "database" not in config:
                    config["database"] = {}
                    
                # 更新密码
                config["database"]["password"] = new_password
                
                # 写回文件
                f.seek(0)  # 将文件指针移到开始
                json.dump(config, f, indent=4)  # 写入新配置
                f.truncate()  # 截断文件，删除可能的剩余内容
        except Exception as e:
            # 发送更新失败信号
            self.config_updated_signal.emit(False, f"更新数据库配置失败: {e}")
            return
        
        # 更新其他配置文件中的密码
        for file_path in self.file_paths:
            try:
                # 打印下file_path
                print(file_path)
                with open(file_path, 'r+') as f:
                    # 读取文件内容
                    content = f.read()
                    
                    # 使用正则表达式更新密码配置行
                    # 匹配 "databasePassword = xxx" 或 "databasePassword: xxx" 格式
                    updated_content = re.sub(
                        r'(databasePassword\s*[:=]\s*).*', 
                        f'\\1{new_password}', 
                        content
                    )
                    
                    # 写回更新后的内容
                    f.seek(0)  # 将文件指针移到开始
                    f.write(updated_content)  # 写入新内容
                    f.truncate()  # 截断文件，删除可能的剩余内容
                    
                    # 发送更新成功信号
                    self.config_updated_signal.emit(True, f"成功更新配置文件: {file_path}")
                    
            except Exception as e:
                # 发送更新失败信号
                error_msg = f"更新配置文件 {file_path} 失败: {e}"
                self.config_updated_signal.emit(False, error_msg)